// DataLibrary FunctionPlugin - Library

// 識別子：DL
// 内容  ：ライブラリ管理。

//----------------------------------------------------------------------------//
// Plugin
//----------------------------------------------------------------------------//

//-- プラグインの読み込み処理 --//
DL_LoadFunction_Library:
	// ライブラリの読み込み処理を優先度5で起動処理に登録する
	Call DL_RegisterStartup "DL_LoadLibrary" 5
Return


//-- プラグインの終了処理 --//
DL_UnloadFunction_Library:
	UnSet DL_LibInfo
	UnSet DL_LibCount
	UnSet DL_LibUnreadCount
	UnSet DL_LibItem
	UnSet DL_ArchiveID
Return


//----------------------------------------------------------------------------//
// LoadLibrary
//----------------------------------------------------------------------------//

//-- LoadLibrary : ライブラリを読み込む --//
DL_LoadLibrary:
	Local path = DL_FolderPath_Library()
	Local file = "Library.ini"
	
	If Not Right(path, 1) Like "[\/]" Then
		path = path & "\"  // 末尾に区切り記号がない場合は追加する
	EndIf
	
	// ライブラリ設定ファイルが見つからなければ終了する
	If Dir(path & file, "ファイル") = "" Then
		Call DL_ErrorMes (file & "が見つかりません。")
		Return
	EndIf
	
	// Library.iniを解析する
	Local library_file
	Local read_data section key value F
	Open (path & file) For 入力 As F
	Do While (EOF(F) = 0)
		read_data = DL_LineRead(F)
		
		If read_data = "" Then
			Skip  // 空行(コメント行も含む)はスキップする
		ElseIf DL_IsSectionLine(read_data) Then
			section = LCase(Mid(read_data, 2, Len(read_data) - 2))  // セクションを取り出す
			Skip
		EndIf
		
		// キーと値に分割する
		If read_data Like "*=*" Then
			key = RegExpReplace(read_data, "^\s*(.*?)\s*=.*", "$1")
			value = RegExpReplace(read_data, ".*=\s*(.*?)\s*$", "$1")
		Else
			key = ""
			value = read_data
		EndIf
		
		// データを設定する
		Switch section
		Case "title"
			Switch LCase(key)
			Case "main" "librarytitle"    // "librarytitle"は旧Ver対応
				Set DL_MainTitle value
			Case "helptitle" "quittitle"  // 旧Ver対応
				Set DL_Option[key] value
			Case Else
				Set DL_Option[key & "Title"] value
			EndSw
		Case "library"
			library_file[Count(library_file) + 1] = value
		Case "option"
			Set DL_Option[key] value
		EndSw
	Loop
	Close F
	
	// ライブラリファイルを読み込む
	Local i
	For i = 1 To Count(library_file)
		Call DL_LoadLibraryFile library_file[i] i
	Next
Return


//-- LoadLibraryFile file lib_id : ライブラリファイルを読み込む --//
DL_LoadLibraryFile:
	Local path = DL_FolderPath_Library()
	Local file = Args(1)
	Local lib_id = Args(2)
	
	If Not Right(path, 1) Like "[\/]" Then
		path = path & "\"  // 末尾に区切り記号がない場合は追加する
	EndIf
	
	// 混同を避ける為、Libraryは指定できないようにする
	If (LCase(file) Like "library") Or (LCase(file) Like "library.*") Then
		Call DL_ErrorMes "Libraryはライブラリファイルに指定できません。"
		Return
	EndIf
	
	// ファイルの存在を確認できない場合は拡張子を取り除く
	If Dir(path & file, "ファイル") = "" Then
		If file Like "*.*" Then
			file = RegExpReplace(file, "(.*)\..*$", "$1")
		EndIf
	EndIf
	
	// 拡張子が含まれていない場合は拡張子を付けて検索する
	If Not file Like "*.*" Then
		If Dir(path & file & ".eve", "ファイル") != "" Then
			file = file & ".eve"
		ElseIf Dir(path & file & ".dat", "ファイル") != "" Then
			file = file & ".dat"
		ElseIf Dir(path & file & ".txt", "ファイル") != "" Then
			file = file & ".txt"
		Else
			// ファイルの存在を確認できない場合は終了する
			Call DL_ErrorMes ("ライブラリファイル[" & Args(1) & "]が見つかりません。")
			Return
		EndIf
	EndIf

	// 拡張子がeveだった場合はアーカイブファイルとして読み込む
	If file Like "*.eve" Then
		Call DL_LoadLibraryArchive file lib_id
		Return
	EndIf
	
	// 通常のライブラリファイルとして読み込む
	Local lib_interface = ""
	Local lib_flag = 0
	Local lib_title = ""
	Local lib_comment = ""
	Local lib_icon = ""
	Local is_info = 0
	
	// ライブラリファイルの基本情報を読み込む
	Local read_data key value F
	Open (path & file) For 入力 As F
	Do While (EOF(F) = 0)
		LineRead F read_data
		read_data = Trim(read_data)
		
		// 基本情報の開始終了の判定を行う
		Switch LCase(read_data)
		Case "#libinfo"
			is_info = 1
			Skip
		Case "#endinfo" "#endlib"  // "#endlib"は旧Ver対応
			is_info = 2
			Break
		EndSw
		
		If (is_info = 0) Or (read_data = "") Then
			Skip  // 基本情報以外の行をスキップする
		EndIf
		
		// キーと値に分割する
		If read_data Like "*=*" Then
			key = RegExpReplace(read_data, "^\s*(.*?)\s*=.+", "$1")
			value = RegExpReplace(read_data, ".+=\s*(.*?)\s*$", "$1")
		Else
			Skip
		EndIf
		
		// データを設定する
		Switch LCase(key)
		Case "#interface" "#type"  // "#type"は旧Ver対応
			lib_interface = value
		Case "#defaultflag"
			lib_flag = IIf(IsNumeric(value), value, 0)
		Case "#title"
			lib_title = value
		Case "#comment"
			lib_comment = value
		Case "#icon"
			lib_icon = value
		EndSw
	Loop
	
	Local load_error = 0
	
	// 基本情報が正常に読み込まれたか確認する
	If is_info = 0 Then
		Call DL_ErrorMes (file & ";#LibInfoが未設定です。")
		load_error = 1
	ElseIf is_info = 1 Then
		Call DL_ErrorMes (file & ";#EndInfoが未設定です。")
		load_error = 1
	ElseIf lib_interface = "" Then
		Call DL_ErrorMes (file & ";インターフェースが未設定です。")
		load_error = 1
	EndIf
	
	// 使用するInterfacePluginを読み込む
	Call DL_LoadInterface lib_interface
	If Not DL_IsPlugin(lib_interface, "Interface") Then
		Call DL_ErrorMes (file & ";[" & lib_interface & "] は存在しないインターフェースです。")
		load_error = 1
	EndIf
	
	// 読み込みに失敗した場合は終了する
	If load_error = 1 Then
		Close F
		Return
	EndIf
	
	// ライブラリを設定する
	Call DL_RegisterLibraryFile lib_id lib_interface lib_flag lib_title lib_comment lib_icon
	
	// インターフェースの読み込み処理を呼び出す
	If Eval("DL_LoadLibraryFile_" & lib_interface & "(F, lib_id)") != "" Then
		Call DL_ErrorMes ("[" & lib_interface & "] は指定可能なインターフェースではありません。")
		UnSet DL_LibInfo[lib_id]
		UnSet DL_LibCount[lib_id]
		UnSet DL_LibUnreadCount[lib_id]
	EndIf
	
	Close F
Return


//-- LoadLibraryArchive file : アーカイブファイルを読み込む --//
DL_LoadLibraryArchive:
	Local path = DL_FolderPath_Library()
	Local file = Args(1)
	Local lib_id = Args(2)
	
	If Not Right(path, 1) Like "[\/]" Then
		path = path & "\"  // 末尾に区切り記号がない場合は追加する
	EndIf
	
	// アーカイブ情報を確認する
	Local read_data F
	Open (path & file) For 入力 As F
	
	// アーカイブファイルか確認する
	LineRead F read_data
	If LCase(read_data) != "#datalibrary archivefile" Then
		Call DL_ErrorMes (file & "はアーカイブファイルではありません。")
		Close F
		Return
	EndIf
	
	// アーカイブIDを取得する
	LineRead F read_data
	If LCase(LIndex(read_data, 1)) != "#archiveid" Then
		Call DL_ErrorMes (file & ";アーカイブIDが設定されていません。")
		Close F
		Return
	ElseIf LIndex(read_data, 2) = "" Then
		Call DL_ErrorMes (file & ";アーカイブIDが取得できませんでした。")
		Close F
		Return
	EndIf
	Set DL_ArchiveID[lib_id] LIndex(read_data, 2)
	
	Close F
	
	Local load_error = 0
	
	// アーカイブファイルとして読み込む
	Require (path & file)
	Call ("DL_LoadArchive_" & DL_ArchiveID[lib_id]) lib_id
	
	// 使用するInterfacePluginを読み込む
	Local lib_interface = DL_GetLibInterface(lib_id)
	Call DL_LoadInterface lib_interface
	If lib_interface = "" Then
		Call DL_ErrorMes (file & ";インターフェースが未設定です。")
		load_error = 1
	ElseIf Not DL_IsPlugin(lib_interface, "Interface") Then
		Call DL_ErrorMes (file & ";[" & lib_interface & "] は存在しないインターフェースです。")
		load_error = 1
	EndIf
	
	// 読み込みに失敗した場合は終了する
	If load_error = 1 Then
		UnSet DL_LibInfo[lib_id]
		UnSet DL_LibCount[lib_id]
		UnSet DL_LibUnreadCount[lib_id]
		Return
	EndIf
	
	// インターフェースの読み込み処理を呼び出す
	If Eval("DL_LoadLibraryFile_" & lib_interface & "(`ARCHIVE`, lib_id)") != "" Then
		Call DL_ErrorMes ("[" & lib_interface & "] は指定可能なインターフェースではありません。")
		UnSet DL_LibInfo[lib_id]
		UnSet DL_LibCount[lib_id]
		UnSet DL_LibUnreadCount[lib_id]
	EndIf
Return


//-- DL_RegisterLibraryFile lib_id interface flag title comment icon : ライブラリファイルを登録する --//
DL_RegisterLibraryFile:
	Local lib_id = Args(1)
	Local interface = Args(2)
	Local flag = Args(3)
	Local title = Args(4)
	Local comment = Args(5)
	Local icon = Args(6)
	
	// スキンフォルダのパスに置き換える
	If InStr(icon, "$SKIN$") > 0 Then
		Local path = DL_FolderPath_Skin()
		If LCase(path) Like "Lib*" Then
			path = "..\" & path
		EndIf
		If Not Right(path, 1) Like "[\/]" Then
			path = path & "\"  // 末尾に区切り記号がない場合は追加する
		EndIf
		icon = Replace(icon, "$SKIN$", path)
	EndIf
	
	Set DL_LibInfo[lib_id] List("(" & interface & ")", flag, "(" & title & ")", "(" & comment & ")", "(" & icon & ")")
	Set DL_LibCount[lib_id] 0
	Set DL_LibUnreadCount[lib_id] 0
Return


//-- DL_UpdateLibraryFile lib_id interface flag title comment icon : ライブラリファイルを登録する --//
DL_UpdateLibraryFile:
	If Not IsVarDefined(DL_LibInfo[Args(1)]) Then
		Return
	EndIf
	
	Local lib_id = Args(1)
	Local interface = IIf(Args(2) != "-", Args(2), DL_GetLibInterface(lib_id))
	Local flag = IIf(Args(3) != "-", Args(3), DL_GetLibDefaultFlag(lib_id))
	Local title = IIf(Args(4) != "-", Args(4), DL_GetLibTitle(lib_id))
	Local comment = IIf(Args(5) != "-", Args(5), DL_GetLibComment(lib_id))
	Local icon = IIf(Args(6) != "-", Args(6), DL_GetLibIcon(lib_id))
	
	Set DL_LibInfo[lib_id] List("(" & interface & ")", flag, "(" & title & ")", "(" & comment & ")", "(" & icon & ")")
Return


//-- RegisterLibraryItem lib_id data_id data : ライブラリの項目を登録する --//
DL_RegisterLibraryItem:
	Local lib_id = Args(1)
	Local data_id = Args(2)
	Local data = Args(3)
	
	// フラグが1以上なら項目を登録する
	If DL_GetFlag(data_id, lib_id) > 0 Then
		Incr DL_LibCount[lib_id] 1
		Incr DL_LibUnreadCount[lib_id] DL_IsFlagUnread(data_id)
		Set DL_LibItem[lib_id, DL_LibCount[lib_id]] List(data_id, "(" & data & ")")
	ElseIf DL_GetLibDefaultFlag(lib_id) = "*" Then
		// デフォルトフラグに-1が指定されていた場合はフラグに関係なく登録する
		Incr DL_LibCount[lib_id] 1
		Set DL_LibItem[lib_id, DL_LibCount[lib_id]] List(data_id, "(" & data & ")")
	EndIf
Return


//-- UpdateLibraryItem lib_id item_num data_id data : ライブラリの項目を更新する --//
DL_UpdateLibraryItem:
	If Not IsVarDefined(DL_LibItem[Args(1), Args(2)]) Then
		Return  // 項目が存在しなければ終了する
	EndIf
	
	Local lib_id = Args(1)
	Local item_num = Args(2)
	Local data_id = DL_GetLibItemID(lib_id, item_num)
	Local data = DL_GetLibItemData(lib_id, item_num)
	
	// DATA_IDを変更する
	If (Args(3) != "") And (Args(3) != "-") Then
		data_id = Args(3)
	EndIf
	
	// 格納データを変更する
	If (Args(4) != "") And (Args(4) != "-") Then
		data = Args(4)
	EndIf
	
	Set DL_LibItem[lib_id, item_num] List(data_id, "(" & data & ")")
Return


//-- SetLibItemUnread lib_id data_id status : 項目の未読状態を設定する --//
DL_SetLibItemUnread:
	Local lib_id = Args(1)
	Local data_id = Args(2)
	Local read = Args(3)
	
	If DL_IsFlagUnread(data_id) = read Then
		Return  // すでに同じ状態なら終了する
	EndIf
	
	// 未読状態を設定する
	Local num = IIf(read = 1, 1, -1)
	Call DL_SetFlagUnread data_id read
	Incr DL_LibUnreadCount[lib_id] num
	
	// グループライブラリ用の処理を行う
	Do While (lib_id Like "*_*")
		lib_id = Left(lib_id, InStrRev(lib_id, "_") - 1)
		Incr DL_LibUnreadCount[lib_id] num
	Loop
Return


//----------------------------------------------------------------------------//
// GetLibData
//----------------------------------------------------------------------------//

//-- GetLibInterface(lib_id) : インターフェースを返す --//
DL_GetLibInterface:
Return LIndex(DL_LibInfo[Args(1)], 1)


//-- GetLibDefaultFlag(lib_id) : 初期フラグ値を返す --//
DL_GetLibDefaultFlag:
Return LIndex(DL_LibInfo[Args(1)], 2)


//-- GetLibTitle(lib_id) : タイトルを返す --//
DL_GetLibTitle:
Return LIndex(DL_LibInfo[Args(1)], 3)


//-- GetLibComment(lib_id) : コメントを返す --//
DL_GetLibComment:
Return LIndex(DL_LibInfo[Args(1)], 4)


//-- GetLibIcon(lib_id) : アイコンファイル名を返す --//
DL_GetLibIcon:
Return LIndex(DL_LibInfo[Args(1)], 5)


//-- GetLibItemID(lib_id, item_num) : 項目のDATA_IDを返す --//
DL_GetLibItemID:
Return LIndex(DL_LibItem[Args(1), Args(2)], 1)


//-- GetLibItemData(lib_id, item_num, data_num) : 項目のデータを返す --//
DL_GetLibItemData:
Return LIndex(LIndex(DL_LibItem[Args(1), Args(2)], 2), Args(3))


